﻿#pragma once

#include "topo_base.h"

namespace CAGD
{

/**
 * 拓扑半边.
 */
class TopoCoedge : public TopoBase
{
  public:
    /**
     * @brief 空构造（用于 Mesh）.
     * @see
     */
    TopoCoedge();

    /**
     * @brief 析构.
     * @see
     */
    ~TopoCoedge();

    /**
     * @brief 返回参数曲线.
     * @return
     * @see
     */
    Handle(Geom2dCurve) Geom() const;

    /**
     * @brief 伙伴 coedge.
     * @return
     * @see
     */
    TopoCoedge *&Twin();

    /**
     * @brief 前一条半边.
     * @return
     * @see
     */
    TopoCoedge *&Prev();

    /**
     * @brief 下一条半边.
     * @return
     * @see
     */
    TopoCoedge *&Next();

    /**
     * @brief 所属 loop.
     * @return
     * @see
     */
    TopoLoop *&Loop();

    /**
     * @brief 所属 wire.
     * @return
     * @see
     */
    TopoWire *&Wire();

    /**
     * @brief 所属 edge.
     * @return
     * @see
     */
    TopoEdge *&Edge();

    /**
     * @brief 获得拓扑方向.
     * @return
     * @see
     */
    TopoDir Dir() const;

    /**
     * @brief 返回是否位于边界.
     * @return
     * @see
     */
    bool Boundary() const;

    /**
     * @brief 拓扑类型.
     * @return
     * @see
     */
    TopoType Type() const override;

  protected:
    Handle(Geom2dCurve) m_curve; // 参数曲线
    TopoCoedge *m_twin;          // 反向边，不一定存在
    TopoCoedge *m_prev;          // 上一条半边，一定存在，在面上
    TopoCoedge *m_next;          // 下一条半边，一定存在，在面上
    TopoLoop *m_loop;            // 所属的 loop
    TopoWire *m_wire;            // 所属的 wire
    TopoEdge *m_edge;            // 所属的边
    TopoDir m_dir;               // 拓扑方向
};

} // namespace CAGD
